package com.xr.common.utils;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Objects;

/**
 * 自定义统一结果封装返回类
 *
 * @author XR FZH
 */
public class R extends HashMap<String, Object> implements Serializable {

	private static final long serialVersionUID = 1L;

	private static final Integer HTTP_OK_CODE = 10000;

	private static final Integer HTTP_ERROR_CODE = 50000;

	private static final String OK_MSG = "执行成功";

	private static final String ERROR_MSG = "执行失败";

	public static final String CODE = "code";

	public static final String MSG = "msg";

	public static final String DATA = "data";

	public R put(String key, Object value) {
		super.put(key, value);
		return this;
	}

	/**
	 * 执行成功返回默认成功消息
	 * @return R 封装对象
	 */
	public static R ok() {
		return Objects.requireNonNull(new R().put(CODE, HTTP_OK_CODE)).put(MSG, OK_MSG);
	}

	/**
	 * 执行成功返回自定义成功消息
	 * @param msg 消息
	 * @return R 封装对象
	 */
	public static R ok(String msg) {
		return Objects.requireNonNull(new R().put(CODE, HTTP_OK_CODE)).put(MSG, msg);
	}

	/**
	 * 执行成功返回默认成功消息 和 默认Object（对应的key值为 "data"，调用时只需传入一个Object对象的参数）
	 * @param data 数据
	 * @return R 封装对象
	 */
	public static R ok(Object data) {
		return Objects.requireNonNull(Objects.requireNonNull(new R().put(CODE, HTTP_OK_CODE)).put(MSG, OK_MSG))
				.put(DATA, data);
	}

	/**
	 * 执行成功返回自定义成功消息 和 默认Object（对应的key值为 "data"，调用时只需传入一个Object对象的参数）
	 * @param msg 消息
	 * @param data 数据
	 * @return R 封装对象
	 */
	public static R ok(String msg, Object data) {
		return Objects.requireNonNull(Objects.requireNonNull(new R().put(CODE, HTTP_OK_CODE)).put(MSG, msg)).put(DATA,
				data);
	}

	/**
	 * 执行失败返回默认失败消息
	 * @return R 封装对象
	 */
	public static R error() {
		return Objects.requireNonNull(new R().put(CODE, HTTP_ERROR_CODE)).put(MSG, ERROR_MSG);
	}

	/**
	 * 执行失败返回自定义失败消息
	 * @param msg 消息
	 * @return R 封装对象
	 */
	public static R error(String msg) {
		return Objects.requireNonNull(new R().put(CODE, HTTP_ERROR_CODE)).put(MSG, msg);
	}

	/**
	 * 执行失败返回默认失败消息 和 默认Object（对应的key值为 "data"，调用时只需传入一个Object对象的参数）
	 * @param data 数据
	 * @return R 封装对象
	 */
	public static R error(Object data) {
		return Objects.requireNonNull(Objects.requireNonNull(new R().put(CODE, HTTP_ERROR_CODE)).put(MSG, ERROR_MSG))
				.put(DATA, data);
	}

	/**
	 * 执行失败返回自定义失败消息 和 默认Object（对应的key值为 "data"，调用时只需传入一个Object对象的参数）
	 * @param msg 消息
	 * @param data 数据
	 * @return R 封装对象
	 */
	public static R error(String msg, Object data) {
		return Objects.requireNonNull(Objects.requireNonNull(new R().put(CODE, HTTP_ERROR_CODE)).put(MSG, msg))
				.put(DATA, data);
	}

}
